package cn.iocoder.yudao.module.wine.dal.mysql.messageboard;

import java.util.*;

import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.wine.controller.admin.messageboard.vo.MessageBoardPageReqVO;
import cn.iocoder.yudao.module.wine.controller.admin.messageboard.vo.MessageBoardRespVO;
import cn.iocoder.yudao.module.wine.dal.dataobject.messageboard.MessageBoardDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.wine.controller.app.messageboard.vo.*;

/**
 * 用户留言板 Mapper
 *
 * @author 管理员
 */
@Mapper
public interface MessageBoardMapper extends BaseMapperX<MessageBoardDO> {

    default List<AppMessageBoardRespVO> appSelectMessageBoardDialog(AppMessageBoardPageReqVO reqVO) {
        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
        return selectJoinList(AppMessageBoardRespVO.class,new MPJLambdaWrapperX<MessageBoardDO>()
                .eqIfExists(MessageBoardDO::getSendId, loginUserId)
                .or()
                .eqIfExists(MessageBoardDO::getReceiveId, loginUserId)
                .groupBy(MessageBoardDO::getChatId)
                .orderByDesc(MessageBoardDO::getCreateTime));

    }

    default PageResult<MessageBoardRespVO> selectPage(MessageBoardPageReqVO reqVO) {
        return selectJoinPage(reqVO, MessageBoardRespVO.class,new MPJLambdaWrapperX<MessageBoardDO>()
                .eqIfPresent(MessageBoardDO::getSendId, reqVO.getSendId())
                .eqIfPresent(MessageBoardDO::getReceiveId, reqVO.getReceiveId())
                .eqIfPresent(MessageBoardDO::getContent, reqVO.getContent())
                .eqIfPresent(MessageBoardDO::getTypeId, reqVO.getTypeId())
                .eqIfPresent(MessageBoardDO::getInfoId, reqVO.getInfoId())
                .betweenIfPresent(MessageBoardDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(MessageBoardDO::getIsRead, reqVO.getIsRead())
                .leftJoin(MemberUserDO.class,MemberUserDO::getId,MessageBoardDO::getSendId)
                .selectAll(MessageBoardDO.class)
                .selectAs(MemberUserDO::getName,MessageBoardRespVO::getName)
                .orderByDesc(MessageBoardDO::getId));
    }

    default List<MessageBoardDO> selectContentList(AppMessageBoardContentListReqVO listReqVO){
        return selectList(new LambdaQueryWrapperX<MessageBoardDO>()
                .eqIfPresent(MessageBoardDO::getChatId, listReqVO.getChatId())
                .orderByAsc(MessageBoardDO::getCreateTime));
    }

    default Long getChatId(Long buyUserId, Long saleUserId){
        List<MessageBoardDO> list = selectList(new MPJLambdaWrapperX<MessageBoardDO>()
                .eqIfExists(MessageBoardDO::getSendId, buyUserId)
                .eqIfExists(MessageBoardDO::getReceiveId, saleUserId)
                .or()
                .eqIfExists(MessageBoardDO::getSendId, saleUserId)
                .eqIfExists(MessageBoardDO::getReceiveId, buyUserId)
                .orderByDesc(MessageBoardDO::getCreateTime));
        if (!CollectionUtil.isEmpty(list)){
            return list.get(0).getChatId();
        }
        return null;
    }
}
